#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/timerfd.h>
#include <cstdint>

void print_current_time() {
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    printf("当前时间: %ld 秒 %ld 纳秒\n", ts.tv_sec, ts.tv_nsec);
}

int main()
{
    /* int timerfd_create(int clockid, int flags); 
        clockid:  CLOCK_REALTIME-系统实时时间，如果修改了系统时间就会出问题；
        CLOCK_MONOTONIC-从开机到现在的时间是⼀种相对时间；
        flags: 0-默认阻塞属性
    */

    int timerfd = timerfd_create(CLOCK_MONOTONIC, 0);
    if (timerfd < 0) {
        perror("timerfd_create error");
        return -1;
    }
    // int timerfd_settime(int fd, int flags, struct itimerspec *new, struct itimerspec *old); 
    // fd: timerfd_create返回的⽂件描述符
    // flags: 0-相对时间， 1-绝对时间；默认设置为0即可. new： ⽤于设置定时器的新超时时间 old： ⽤于接收原来的超时时间
    // struct timespec { time_t tv_sec;                /* Seconds */ long   tv_nsec;               /* Nanoseconds */ };
    // struct itimerspec {
    // struct timespec it_interval;  /* 第⼀次之后的超时间隔时间 */
    // struct timespec it_value;     /* 第⼀次超时时间 */ };
    
    struct itimerspec itime;
    itime.it_value.tv_sec = 1;
    itime.it_value.tv_nsec = 0;// 第一次超时时间为1s后
    itime.it_interval.tv_sec = 1;
    itime.it_interval.tv_nsec = 0;// 第一次超时后，每次超时的时间间隔
    timerfd_settime(timerfd, 0, &itime, NULL);
    // print_current_time();
    while (1) {
        uint64_t times;
        int ret = read(timerfd, &times, 8);
        if (ret < 0) {
            perror("read error");
            return -1;
        }
        // print_current_time();
        printf("超时，距离上一次超时了%ld次\n", times);
        // sleep(2);
    }
    close(timerfd);
    return 0;
}
